#include "my_error.h"

int  daemon_flags;

static void err_doit(int ,int ,const char *,va_list);

void err_ret(const char *fmt, ...)
{
    va_list ap;
    
    va_start(ap,fmt);
    err_doit(1,LOG_INFO,fmt,ap);
    va_end(ap);
    return;
}

void err_sys(const char *fmt, ...)
{
    va_list ap;
    va_start(ap,fmt);
    err_doit(1,LOG_INFO,fmt,ap);
    va_end(ap);
    exit(1);
}

void err_dump(const char *fmt, ...)
{
   va_list ap;
   va_start(ap,fmt);
   err_doit(1,LOG_INFO,fmt,ap);
   va_end(ap);
   abort();
   exit(1);
}

void err_msg(const char *fmt, ...)
{
   va_list ap;
   va_start(ap,fmt);
   err_doit(0,LOG_INFO,fmt,ap);
   va_end(ap);
   return;
}

void err_quit(const char *fmt , ...)
{
  va_list ap;
  va_start(ap,fmt);
  err_doit(0,LOG_INFO,fmt,ap);
  va_end(ap);
  exit(1); 
}

static void err_doit(int errflags,int level,const char *fmt,va_list ap)
{
    int saveerrno , n;  
    char buf[MAXLINE];     
    saveerrno = errno; 

    #ifdef HAVE_VSNPRINTF
	vsnprintf(buf,sizeof(buf),fmt,ap);
    #else
        vsprintf(buf,fmt,ap);
    #endif

    n = strlen(buf);

    if(errflags)
         snprintf(buf+n,sizeof(buf)-n,", %d:%s",errno,strerror(saveerrno));
    strcat(buf,"\n");
    
    if(daemon_flags){
	syslog(level,buf);
    }else{  
	fflush(stdout);
	fputs(buf,stderr);
	fflush(stderr);
    } 
    return; 
}
